package com.chenkaiwei.eurekaclientfeigndemo;

import com.netflix.hystrix.contrib.javanica.annotation.DefaultProperties;
import com.netflix.hystrix.contrib.javanica.annotation.HystrixCommand;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.Assert;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
@Slf4j
@DefaultProperties(defaultFallback = "global_fallback_method")
public class ProductController {

    @Autowired
    DataRemoteService dataRemoteService;


//    @Value("${birthday}")
//    String birthday;//直接使用远程配置中属性
//
//    @RequestMapping("/products")
//    @HystrixCommand(fallbackMethod="errorCallBack")
//    public Object products(Model m) {
//        String ps = dataRemoteService.dataFromRemoteService();
//        m.addAttribute("ps", ps);
////        m.addAttribute("birthday",birthday);
//        return "products";
//    }


    //单纯调用一下
    @RequestMapping("/products")
    public String products() {
        String res;
        res= dataRemoteService.dataFromRemoteService2();

        log.info(res);
        return res;
    }

    @RequestMapping("/fallbackTest1")
    @HystrixCommand(fallbackMethod="errorCallBack")//增加了降级：方法1，亲测有效。
    public String fallbackTest1() {
        String ps;
        ps= dataRemoteService.dataFromRemoteService2();
        log.info(ps);
        return ps;
    }

    //降级：方法2测试
    @RequestMapping("/fallbackTest2")
    public String fallbackTest2() {
        String res;
        res= dataRemoteService.dataFromRemoteService();

        log.info(res);
        return res;
    }

    @HystrixCommand
    @RequestMapping("/fallbackTest3")
    public String fallbackTest3() {
        String res;
        res= dataRemoteService.dataFromRemoteService2();

        log.info(res);
        return res;
    }

    @HystrixCommand
    @RequestMapping("/fallbackTest4")
    public String fallbackTest4() {
        String res=null;

        Assert.notNull(res,"res不能为空");
        //↑一样走全局服务降级，说明这个全局配置的原理是响应所有抛出的异常。
        //估计也会短路掉全局error的配置，和全局异常Advice配置。（也可能被那俩短接，总之不好，是冲突）。
        //看来feignClient里设fallback才是最合适的，仅针对无法访问到远程服务。

        log.info(res);
        return res;
    }



    //指定一个降级的方法
    //注意：得保证返回值一致
    public String errorCallBack(){
        return "callback method：无法访问到远程服务dataFromRemoteService";
    }


    // 下面是全局fallback方法
    public String global_fallback_method()
    {
        return "全局服务降级 global_fallback_method ";
    }
}